package com.luhuiguo.cms.client.widget;

import java.util.List;

import com.extjs.gxt.ui.client.binding.FieldBinding;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.luhuiguo.cms.client.widget.binding.LabelValueComboBoxFieldBinding;

public class LabelValueComboBox<T> extends ComboBox<LabelValue<T>> {

    /**
     * 构造函数。
     */
    public LabelValueComboBox() {
        this(false);
    }

    /**
     * 构造函数。
     * 
     * @param verbose
     *            是否详细显示标签以及值
     */
    public LabelValueComboBox(boolean verbose) {
        setStore(new ListStore<LabelValue<T>>());

        if (verbose) {
            getView().setModelProcessor(new LabelValueModelProcessor<LabelValue<T>>());
            setDisplayField(LabelValueModelProcessor.DISPLAY);
        } else {
            setDisplayField(LabelValue.LABEL);
        }
    }

    /**
     * 添加标签、值选项列表。
     * 
     * @param labelValues
     *            选项列表
     */
    public void add(List<LabelValue<T>> labelValues) {
        store.add(labelValues);
    }

    /**
     * 添加选项。
     * 
     * @param label
     *            标签
     * @param value
     *            值
     */
    public void add(String label, T value) {
        store.add(new LabelValue<T>(label, value));
    }

    /**
     * 添加选项。
     * 
     * @param labelValue
     *            标签-值选项
     */
    public void add(LabelValue<T> labelValue) {
        store.add(labelValue);
    }

    /**
     * 得到选中的索引。
     * 
     * @return 索引值，没有选择返回<code>-1</code>
     */
    public int getSelectedIndex() {
        LabelValue<T> c = getValue();
        if (c != null) {
            return store.indexOf(c);
        }
        return -1;
    }

    /**
     * 返回选项的实际值。
     * 
     * @return 下拉框的实际值。
     */
    @SuppressWarnings("unchecked")
    public T getOptionValue() {
        LabelValue<T> c = getValue();
        if (c != null) {
            return c.<T> get(LabelValue.VALUE);
        }
        try {
            return (T) getRawValue();
        } catch (Exception e) {
            return null;
        }

    }
    
    /**
     * 设置下拉框的选项值。
     * 
     * @param value
     *            指定选项值
     */
    public void setOptionValue(T value) {
        LabelValue<T> c = findModel(value);
        if (c != null) {
            setValue(c);
        }
    }

    /**
     * 去除指定值对应的选项。
     * 
     * @param value
     *            指定值
     */
    public void remove(T value) {
        for (LabelValue<T> c : store.getModels()) {
            if (c.getValue().equals(value)) {
                store.remove(c);
            }
        }
    }

    /**
     * 去除所有选项。
     */
    public void removeAll() {
        store.removeAll();
    }

    /**
     * 得到值对应的模型。
     * 
     * @param value
     *            选项实际值
     * @return the 指定值对应的模型
     */
    public LabelValue<T> findModel(T value) {
        LabelValue<T> val = null;
        for (LabelValue<T> c : store.getModels()) {
            if (c.getValue().equals(value)) {
                val = c;
                break;
            }
        }
        return val;
    }

    public FieldBinding getFieldBinding() {
        return new LabelValueComboBoxFieldBinding<T>(this, getName());
    }
}

